GtkCssProvider: Make selectors applying from the topmost widget rank higher
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 13 Dec 2010 11:44:29 +0000 (12:44 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Mon, 13 Dec 2010 21:31:28 +0000 (22:31 +0100)
For example, for an entry within a notebook, previously these 2 rules would
have the same weight:

.entry {}
.notebook {}

Now ".entry" will rank higher than ".notebook" for the GtkEntry, further
specific selectors such as:

.notebook .entry {}

still get a higher score than the previous ones.

gtk/gtkcssprovider.c

index 0e1f8af9140f98d2f378974656ec8fcf1ed2af50..02356f4fa0b498ff5e9e4f4a985476cf327ee8f6 100644 (file)
@@ -1150,7 +1150,7 @@ compare_selector (GtkWidgetPath *path,
                   SelectorPath  *selector)
 {
   GSList *elements = selector->elements;
-  gboolean match = TRUE;
+  gboolean match = TRUE, first = TRUE, first_match = FALSE;
   guint64 score = 0;
   gint i;
 
@@ -1165,6 +1165,9 @@ compare_selector (GtkWidgetPath *path,
 
       match = compare_selector_element (path, i, elem, &elem_score);
 
+      if (match && first)
+        first_match = TRUE;
+
       /* Only move on to the next index if there is no match
        * with the current element (whether to continue or not
        * handled right after in the combinator check), or a
@@ -1197,6 +1200,8 @@ compare_selector (GtkWidgetPath *path,
           score <<= 4;
           score |= elem_score;
         }
+
+      first = FALSE;
     }
 
   /* If there are pending selector
@@ -1208,6 +1213,13 @@ compare_selector (GtkWidgetPath *path,
 
   if (!match)
     score = 0;
+  else if (first_match)
+    {
+      /* Assign more weight to these selectors 
+       * that matched right from the first element.
+       */
+      score <<= 4;
+    }
 
   return score;
 }